Tampilkan postingan dengan label Sistem Operasi. Tampilkan semua postingan
Tampilkan postingan dengan label Sistem Operasi. Tampilkan semua postingan

Rabu, 09 Agustus 2017

Cara Install Linux Dengan Flashdisk (Semua Jenis Distro)


Kalau dulu komputer identik dengan power supply, CPU dan monitor; sekarang komputer juga mencakup perangkat serupa yang lebih portabel. Ya, benar. Laptop.

Belum cukup di situ, perkembangan teknologi semikonduktor semakin canggih, memungkinkan terciptanya perangkat mikro di sekitar kita. Apalagi, dengan melihat keadaan bumi seperti sekarang, akhrinya menuntut para ilmuwan untuk segera mengakselerasi kerjanya dalam mengembangkan energi terbarukan dan juga meminimalisir penggunaan listrik pada perangkat elektronik.

Karena alasan itulah notebook perangkat IoT diciptakan sebagai penerus laptop. Selain lebih portabel, notebook juga lebih hemat energi tentunya. Tapi kali ini kita tidak akan membahas laptop ataupun notebook, ya.

Karena semakin kecil, beberapa fitur terpaksa harus ditiadakan. Contohnya saja perangkat CD/DVD. Sedangkan kita tahu bahwa di luar sana semua jenis sistem operasi yang bebas didownload umumnya hanya akan memberikan paket dalam bentuk file ISO yang nantinya harus dibakar ke CD/DVD kosong.

Tenang saja, bagi kalian yang merasa instalasi melalui CD/DVD tidak memungkinkan, kalian masih bisa melakukan instalasi melalui USB Flashdisk. Meski semua paket installer sistem operasi hanya tersedia dalam bentuk file ISO, semua developer sudah mempertimbangkan keberadaan perangkat yang tidak memungkinkan proses instalasi melalui CD/DVD, kok. Makanya, semua ISO tersebut sebagian besar sudah dibuat kompatibel dengan standar untuk instalasi USB flashdisk.

To the point saja, ya. Intinya, hampir semua file installer bisa diekstrak ke flashdisk. Tapi tidak sembarangan. Ada hal teknis yang perlu diperhatikan. Kita tidak akan membahas hal itu, karena beberapa software sudah tersedia untuk menaruh ISO ke USB flashdisk serta mengurus semua hal teknisnya.

Salah satu software yang populer untuk membuat installer distro Linux untuk USB flashdisk adalah YUMI. Ada juga yang namanya Universal USB Installer. Baik YUMI atapun UUI, prinsip kerjanya sama. Keduanya bisa digunakan untuk membuat installer distro Linux yang dapat berjalan melalui USB flashdisk.

Screenshot di atas adalah tampilan dari software YUMI. Jika diperhatikan software Universal USB Installer memiliki cara kerja dan tampilan yang tidak jauh berbeda.

Berikut adalah prosedur penggunaan YUMI untuk membuat installer distro Linux via USB flashdisk.
1. Download YUMI di sini.
2. Buka programnya
3. Klik tombol Agree.
4. Lihat screenshot di atas. Pertama, pilih lokasi flahdisk anda dengan benar, misalnya G:. Jika tidak ada di opsi tersebut, centang opsi Show All Drives. Kedua, pilih jenis distro yang ingin di install. Ketiga, pillih file ISO yang sudah didownload. Terakhir, klik Create.
5. Setelah klik Create, anda akan melihat message box konfirmasi seperti di bawah ini.


6. Langsung saja, klik Yes pada pesan tersebut dan tunggu sampai proses selesai.

Selamat mencoba :)

Read more

Jumat, 16 Juni 2017

Pengertian File System dan Beberapa Macam File System

File system atau sistem berkas adalah mekanisme manajemen berkas dalam suatu media penyimpanan dengan tujuan untuk memudahkan akses berkas tersebut secara efektif serta efisien. Dalam kerjanya, sebuah file system memiliki beberapa subfungsi/subsystem untuk mencapai target manajemen efektif dan efisien.

File system diimplementasikan oleh sistem operasi untuk mengatasi keterbatasan kemampuan dari media penyimpanan tersebut. Sehingga sebuah berkas di dalam media penyimpanan bukan hanya dapat disimpan datanya saja. Karena yang terpenting, file system juga akan mengatur bagaimana nama berkas disimpan.

Sebuah berkas bukan saja terdiri atas data, namun juga komponen metadata/informasi mengenai data yang bersangkutan. Apabila dijabarkan, sebuah berkas paling tidak terkandung komponen dasar sebagai berikut:
- data
- nama berkas
- ukuran berkas
- atribut berkas  (misalnya read only atau hidden)
- pemilik berkas
- informasi berkas (waktu pembuatan, waktu modifikasi, ...)

Bukan hanya itu, file system juga harus mampu mengalokasikan seluruh jenis data di atas di dalam disk. Ini karena kemampuan abstrak disk yang terbatas hanya pada pembacaan dan penulisan data.

Sebuah media penyimpanan masa kini umumnya bermodel alokasi berbasis sektoral. Setiap sektor menampung data sebanyak 512 byte. Setiap sektor akan dialamatkan dengan logical block address 0, 1, 2, 3, ...., dst.

Data yang tersimpan dalam sektor  bersifat universal jika dilihat dari sudut pandang media penyimpanan. Artinya, media memandang semua data tersebut sama saja. Jadi, media tidak mampu membedakan apakah data di dalam sektor X merupakan bagian data dari suatu berkas, data mengenai nama berkas, atau mungkin data informasi mengenai berkas. Nah, tugas filesystem adalah mengatasi masalah mendasar tersebut.

Ada banyak jenis filesystem yang bisa ditemui. Perbedaan besar diantara mereka terletak pada bagaimana file system melakukan alokasi komponen berkas ke dalam sektor media penyimpanan, Namun secara garis besar jenis data yang disimpan tetap sama:
- data berkas
- nama berkas
- informasi mengenai berkas.

Komponen informasi mengenai berkas juga banyak memiliki perbedaan disamping kesamaan. Sebagai contoh, beberapa perbandingan file system EXT dan FAT pada aspek informasi file akan nampak seperti berikut.
Informasi mengenai berkas yang sama-sama ada:
- atribut file
- waktu pembuatan file
- waktu modifikasi file
Informasi yang hanya ada di EXT *:
- pemilik file
- hak akses file

* Kedua informasi di atas ada karena semua file dalam EXT bisa dikhususkan untuk dapat dipakai untuk pemakai tertentu saja, sedangkan semua file dalam FAT bebas diakses siapa pun.

Ada banyak sekali macam filesystem. Sebenarnya kesemua jenis ini bisa saja dipakai oleh sistem operasi manapun, akan tetapi beberapa jenis file system memang dipersembahkan khusus untuk sistem operasi tertentu. Untuk dapat menggunakan file system lain, terkadang kita harus menginstall driver untuk file system tersebut, karena sistem operasi belum menyediakannya. Berikut daftar sistem berkas yang dapat anda ketahui:

FAT (File Allocation Table)
Adalah file system pertama yang dikembangkan oleh Microsoft untuk sistem CP/M dan DOS. Seiring dengan tumbuhnya Microsoft, FAT generasi awal sering disebut sebagai FAT12, lalu dilakukan diversifikasi varian FAT16 dan FAT32 yang dapat digunakan untuk kapasitas media lebih besar.

FAT12
FAT12 merupakan sistem berkas yang menggunakan unit alokasi yang memiliki batas hingga 12-bit. File System ini hanya dapat menampung maksimum hanya 12^2 unit alokasi saja atau sebanyak 4096 buah. FAT12 pertama kali digunakan pada Sistem Operasi MS-DOS. Karena kapasitasnya sedikit yakni hanya 32 MB, maka FAT12 hanya digunakan sebagai file system pada media penyimpanan floppy disk.

FAT16
FAT16 merupakan sistem berkas yang menggunakan unit alokasi yang memiliki batas hingga 16-bit. File System ini dapat menampung maksimum 2^16 unit alokasi atau sebanyak 65536. Kapasitas File System ini sebanyak 4 GB, jauh melebihi versi sebelumnya yang hanya 32 MB. Ukuran unit alokasi yang digunakan FAT16 tergantung kapasitas partisi harddisk yang akan diformat. Jika kapasitasnya kurang dari 16 MB, maka yang akan digunakan adalah FAT12. Jika melebihi 16 MB maka yang digunakan adalah FAT16.

FAT32
FAT32 merupakan sistem berkas yang menggunakan unit alokasi yang memiliki batas hingga 32-bit. File System ini dapat menampung maksimum 2^32 unit alokasi atau sebanyak 4294967296. Meskipun demikian, dalam implementasinya, jumlah unit alokasi yang dapat dialamati oleh FAT32 hanya 2^28 atau 268435456 buah. FAT32 pertama kali dikenalkan pada Sistem Operasi Windows 95 OSR2. Pada Sistem Operasi Windows NT 5.x ke atas, hanya mengizinkan pembuatan partisi FAT32 hingga 32 GB. Jika partisinya melebihi 32 GB, maka yang akan digunakan adalah File System NTFS.

exFAT
exFAT singkatan dari Extended File Allocation Table atau sering disebut sebagai FAT64. exFAT merupakan sistem berkas proprietary yang cocok untuk digunakan oleh media-media penyimpanan berbasis memori flash.


NTFS (New Technology File System)

NTFS merupakan File System yang memiliki sebuah desain sederhana namun memiliki kemampuan yang lebih baik dibandingkan FAT File System. NTFS pertama kali dikenalkan Microsoft pada Sistem Operasi Windows NT dan mendukung Sistem Operasi yang terbaru yaitu Windows 7. Sejak pertama kali dibuat hingga sekarang, NTFS telah mengalami perkembangan. Beberapa versi NTFS antara lain:

NTFS versi 1.0
NTFS ini datang bersama dengan Windows NT 3.1. Versi ini menawarkan fungsi yang sangat dasar, tetapi sudah jauh lebih baik dibandingkan FAT File System.

NTFS versi 1.1
NTFS ini datang bersama dengan Windows NT 3.50. Versi ini menambahkan dukungan terhadap pengaturan akses secara diskrit (discretionary access control).

NTFS versi 1.2
NTFS ini datang bersama dengan Windows NT 4.0. Versi ini menambahkan dukungan terhadap auditing setiap berkas dan juga kompresi transparan.

NTFS versi 2.0
NTFS ini tidak dirilis secara umum, karena berbagai kendala yang dialaminya, yang tidak diumumkan oleh Microsoft. Microsoft menggagalkan proyek NTFS 2.0 dan langsung menginjak NTFS 3.0

NTFS versi 3.0
NTFS ini datang bersama dengan Windows 2000. Versi ini menawarkan banyak peningkatan dibandingkan dengan versi sebelumnya. Di antaranya adalah penetapan kuota kepada setiap pengguna, Encrypting File System (EFS), sistem keamanan yang dapat diatur dari server pusat, fitur indeksasi terhadap properti dan isi setiap berkas, dan lain-lain. Selain itu, NTFS 3.0 juga menawarkan dukungan kepada struktur GUID Partition Table dan Logical Disk Management.

NTFS versi 3.1
NTFS ini datang bersama dengan Windows XP SP1 dan Windows Server 2003. Versi ini menawarkan perbaikan yang minor yang terjadi dalam versi sebelumnya (khususnya di bidang performa), dan juga penggantian algoritma enkripsi yang digunakan oleh EFS dari DESX atau 3DES menjadi AES-256.

Ext(Extended File System)
Ext 2 (2nd Extended)
Ext 2 merupakan tipe file system yang paling tua yang masih ada. File system ini pertama kali dikenalkan pada tahun 1993. Ext 2 adalah file system yang paling ampuh di linux dan menjadi dasar dari segala distribusi linux. Pada Ext 2 file system, file data disimpan sebagai data blok. Data blok ini mempunyai panjang yang sama dan meskipun panjangnya bervariasi di antara Ext 2 file system, besar blok tersebut ditentukan pada saat file system dibuat dengan mk2fs. Jika besar blok adalah 1024 bytes, maka file dengan besar 1025 bytes akan memakai 2 blok. Ext 2 File System menyimpan data secara hirarki standar yang banyak digunakan oleh sistem operasi. Data tersimpan di dalam file, file tersimpan di dalam direktori. Sebuah direktori bisa mencakup file dan direktori lagi di dalamnya yang disebut sub direktori.

Ext 3 (3rd Extended)
Ext 3 merupakan peningkatan dari Ext 2 File System. Beberapa peningkatan yang ada antara lain:

Journaling:
Dengan menggunakan journaling, maka waktu recovery pada shut down yang mendadak tidak akan selama pada Ext 2.

Integritas Data:
Ext 3 menjamin adanya integritas data setelah terjadi kerusakan atau unclean shut down. Ext 3 memungkinkan kita memilih jenis dan tipe proteksi dari data.

Kecepatan:
Daripada menulis data lebih dari sekali, Ext 3 mempunyai throughput yang lebih besar daripada Ext 2 karena Ext 3 memaksimalkan pergerakan head harddisk. Kita bisa memilih tiga jurnal mode untuk memaksimalkan kecepatan, tetapi integritas data tidak terjamin.

Mudah Dilakukan Migrasi:
Kita dapat melakukan migrasi atau konversi dari Ext 2 ke Ext 3 tanpa harus melakukan format ulang pada harddisk.

Di samping keunggulan di atas, Ext 3 juga memiliki kekurangan. Dengan adanya fitur journaling, maka membutuhkan memori yang lebih dan memperlambat operasi I/O.

Ext 4 (4th Extended)
Ext 4 dirilis secara komplit dan stabil berawal dari kernel 2.6.28. Jadi, apabila distro yang secara default memiliki kernel tersebut atau di atasnya secara otomatis system sudah support Ext 4. Apabila masih menggunakan Ext 3, dapat dilakukan konversi ke ext 4 dengan beberapa langkah yang tidak terlalu rumit.

Keuntungan menggunakan Ext 4 ini adalah mempunyai pengalamatan 48-bit blok yang artinya dia akan mempunyai 1 EiB = 1.048.576 TB ukuran maksimum file system dengan ukuran 16 TB untuk maksimum file sizenya, fast fsck, journal checksumming, defragmentation support.

Selain dari beberapa macam file system di atas, ada pula sistem berkas yang masih jarang dikenal. Ada CDFS(ISO 9660), UDF, HPFS, ReiserFS, BtrFS, BeFS, BFS, MFS, LEAN, dan masih banyak lagi.

Referensi : https://dhanz3rd.wordpress.com/2010/12/14/file-system-di-windows-dan-linux/
Read more

Kamis, 01 Juni 2017

Pengertian Spinlock dan Implementasinya

Multitasking adalah tantangan baru bagi programmer sistem operasi. Ada banyak macam resource yang harus digunakan oleh semua thread, namun jumlahnya terbatas, dan tidak mungkin diakses bersamaan. Untuk itu, masing-masing thread harus dapat diatur agar dapat mengaksesnya secara bergiliran secara sinkron.

Dalam hal ini, synchronization primitives adalah metode yang perlu diimplementasikan dalam sebuah sistem operasi. Synchronization primitives yaitu sebutan untuk metode yang dapat menjamin seluruh task dalam sistem multitasking agar dapat berjalan secara sinkron dalam pengaksesan sebuah resource.
 
void putchar(int chr){
   ...
}

void print(char * str){
   while (* str){
      putchar(*str);
      str++;
   }
}

Kode di atas adalah contoh sederhana, dimana programmer harus mulai mempertimbangkan untuk mengimplementasikansynchronization primitive. Bayangkan jika dua task mengakses print() secara hampir bersamaan dalam sistem multitasking. Belum sempat salah satu task mencetak satu per satu karakter dari string, tiba-tiba terjadi task switch ke task lain yang juga ingin menggunakan fungsi print().

task 1:
print (“hello”);
task 2:
print (“world”);

Tanpa sinkronisasi, bisa jadi yang akan tampil di layar terlihat kacau. Misalnya saja, apabila setiap baru saja mencetak sebuah karakter, terburu terjadi task switch, mungkin akan tampil seperti ini.


hweolrllod
Spinlock adalah salah satu metode sinkronisasi dengan menerapkan lock. Contohnya pada fungsi print() yang sudah dimodifikasi di bawah ini. Selama fungsi print() diakses oleh salah satu task, print_lock akan tetap bernilai 1. Task lain yang perlu mengakses print() wajib menunggu hingga task sebelumnya menyelesaikan print dan mengembalikan print_lock sehingga bernilai 0.

char print_lock;
void print(char * str){
   acquire_spinlock(&print_lock);
   while (* str){
      putchar(*str);
      str++;
   }
   release_spinlock(&print_lock);
}

Task yang lebih dahulu memanggil print() akan memanggilacquire_spinlock(). Fungsi ini akan meng-set variabel print_lock = 1 apabila print_lock masih bernilai 0, lalu segera melanjutkan eksekusi. Task lain yang berjalan bersamaan namun sedikit tertinggal, akan mengalami peristiwa busy-waiting ketika memanggil acquire_spinlock(), karena print_lock masih di-set bernilai 1 oleh task sebelumnya. Busy-waiting akan terus berlangsung hingga task sebelumnya memanggil release_spinlock(), sehingga meng-set print_lock = 0.

Algoritma
Acquire Spinlock:
1. Tunggu hingga lock bernilai 0.
2. Jika lock sudah 0, set lock = 1.

Release Spinlock:
1. Set lock = 0.

Implementasi
Sederhananya, acquire_spinlock() bisa saja ditulis dengan kode C semacam ini:
void acquire_spinlock(char * lock ){
   while (* lock != 0){
      //do nothing
      //busy-waiting
   }
   * lock = 1;
}

Akan tetapi, dalam dunia nyata, kode di atas jauh kurang efektif. Apalagi dalam keadaan thread yang cukup padat. Ini karena jika diuraikan, kode while() akan diterjemahkan compiler menjadi serangkaian instruksi assembly yang rumit.

tes:
cmp BYTE PTR [print_lock], 0
jne tes
mov BYTE PTR [print_lock], 1

Misalnya, katakanlah terdapat 3 task yang sama-sama melakukan acquire. Task 1 baru saja melepas print_lock. Sayangnya, setelah itu task 2 dan task 3 secara bersamaan baru saja selesai melakukan instruksi CMP yang memberikan sinyal bahwa print_lock sudah terlepas, namun sama-sama pula terjadi task switch sebelum menjalankan instruksi JNE. Akhirnya, task 2 dan task 3 lolos dari lock lalu mengakses fungsi print() secara bersamaan.
Kondisi seperti itu dapat dihindari dengan memanfaatkan atomic operation, yaitu dengan memanfaatkan instruksi assembly yang dapat melakukan acquire tanpa harus melakukan instruksi pembandingan (CMP) ataupun testing terlebih dahulu. Dalam arsitektur intel, ini bisa dilakukan dengan instruksi XCHG yang diinputkan melalui inline assembly.

tes:
mov al, 1
xchg BYTE PTR [print_lock], al
cmp al,1
je tes

Selama XCHG menghasilkan nilai 1, sudah diketahui bahwa print_lock masih dikuasai task lain, namun jika 0, artinya task sudah berhasil mengambil alih lock. Meskipun terjadi task switch antar banyak task, semuanya tidak akan dapat melewati taktik XCHG.

inline unsigned char _atomic_xchg8(unsigned char* lock, unsigned char x ){
   asm volatile("xchg %1, %0":"=r" (x):"m"(*(volatile unsigned char *)lock),"0" (x):"memory");
   return x;
}

inline void acquire_spinlock(unsigned char *lock){
   while ( 1){
      if ( _atomic_xchg8(lock, 1)== 0) return ;
      while (* lock != 0){
         asm("pause");
      }
   }
}

inline void release_spinlock(unsigned char *lock){
   * lock = 0;
}
Read more

Jumat, 03 Februari 2017

Contoh Dynamic Memory Allocation Dengan Doubly-linked List, First-fit & Auto Left-Right Join [Part 4]


Bagian terakhir ini akan membahas tentang pembebasan memori ( Free() ). Fungsi free() sejatinya hanya mengubah field state kembali ke 0. Tapi karena tanggung jawabnya, alokator harus mengurus masalah fragmentasi internal. Ia harus memeriksa field bebas lain di sebelah kiri dan kanan chunk yang sedang dibebaskan. Apabila bebas, salah satu atau keduanya harus segera digabungkan.

int Free(void *addr){
HCHUNK *c,*p,*n;
c = (HCHUNK*)((ulong)addr - sizeof(HCHUNK));
if(c->magic != CMAGIC) return ­1;
if(c->state == 0) return ­2;
c->state = 0;
p = c->prev;
n = c->next;
if(n){
if(n->state == 0){
c->size += sizeof(HCHUNK) + n->size;
c->next = n->next;
if(n->next) n->next->prev = c;
}
}

if(p){
if(p->state == 0){
p->size += sizeof(HCHUNK) + c->size;
p->next = c->next;
if(c->next) c->next->prev = p;
}
}
return 0;
}

Proses pembebasan dan penggabungan dibantu dengan 3 buah variabel pointer

HCHUNK.
HCHUNK *c,*p,*n;

c merujuk pada HCHUNK dari alamat chunk yang sedang dibebaskan; p dan n merujuk ke chunk sebelah kiri (previous) dan kanan (next) dari chunk yang sedang dibebaskan.

Argumen addr dari fungsi ini berupa pointer chunk yang telah dialokasikan oleh Malloc() sebelumnya. Untuk mengetahui HCHUNK dari alamat tersebut, kurangi alamat addr dengan ukuran struktur HCHUNK.

c = (HCHUNK*)((ulong)addr - sizeof(HCHUNK));

Pastikan alamat chunk dari argumen addr adalah benar. Jika salah, dapat dipastikan nilai magic dari HCHUNK tidak akan bernilai valid. Jika jelas validitasnya, lanjut periksa juga field state. Jangan sampai kita menyiakan waktu untuk membebaskan chunk yang sudah bebas (state == 0).

if(c->magic != CMAGIC) return ­1;
if(c->state == 0) return ­2;

Cukup sudah. Sekarang bebaskan chunk ini.

c->state = 0;

2 langkah terakhir adalah prosedur penggabungan. Ambil pointer kedua chunk sampingnya dari field prev dan next.

p = c->prev;
n = c->next;

Mulai penggabungan dari chunk sebelah kanan. Dan lanjutkan dengan chunk sebelah kiri.

if(n){
if(n->state == 0){
c->size += sizeof(HCHUNK) + n->size;
c->next = n->next;
if(n->next) n->next->prev = c;
}
}
if(p){
if(p->state == 0){
p->size += sizeof(HCHUNK) + c->size;
p->next = c->next;
if(c->next) c->next->prev = p;
}
}

Nilai n dapat bernilai 0 apabila chunk yang baru saja dibebaskan adalah chunk terakhir. Jadi sebelum memeriksa state dari chunk n, pastikan dulu n bukan 0. Penggabungan dilakukan dengan 2 tahapan; update ukuran chunk pada field size chunk c dengan menambahkannya ukuran dari chunk n. Karena HCHUNK untuk n tidak terpakai lagi, kita juga menambahkan ukuran sejumlah ukuran struktur HCHUNK ( sizeof(HCHUNK) ) pada ukuran chunk c yang baru; kedua, update field next dari c, sehingga link antar chunk akan menjadi seperti di bawah ini.

Lakukan juga hal sama pada p dengan cara seperti sebelumnya.



Debugging
Untuk keperluan pengecekan, saya sudah buatkan fungsi dumper sederhana untuk mencetak properti semua chunk dalam HMALLOC. Kode ini self-explained, ya.

void HMallocDump(HMALLOC *h){
HCHUNK *c = h->first;
printf("HMALLOC Dump:\n");
while(c){
printf("HCHUNK size 0x%x state %x at 0x%x \
   prev 0x%x next 0x%x\n",
c->size,c->state,c, c->prev,c->next);
c = c->next;
}
}


Contoh Hasil
Hasil berikut adalah contoh implementasi Malloc() di kernel JauraOS.
https://github.com/irvanherz/jaura



Read more

Kamis, 02 Februari 2017

Contoh Dynamic Memory Allocation Dengan Doubly-linked List, First-fit & Auto Left-Right Join [Part 3]


Bagian ini akan khusus membahas tentan proses alokasi ( Malloc() ). Sistematika kerja alokator dalam mengalokasikan memori sudah diketahui dari gambar ilustrasi yang kita lihat sebelumnya. Pada prakteknya, ada sedikit penjabaran yang harus diperhatikan. Alokator melakukan alokasi dari fungsi Malloc() yang kita buat. Pencarian mulai dilakukan dari melihat HCHUNK pertama yang ditunjukkan oleh field first pada HMALLOC dan mengikuti pointer next pada HCHUNK hingga ditemukan hasil. Apabila tidak ada chunk bebas yang memiliki ukuran cukup, fungsi harus mengembalikan 0.

for(HCHUNK *c = m­->first; c != 0; c = c-­>next){
//Check chunk (*c)
}
return 0;

Setiap chunk yang diperiksa melewati beberapa urutan tahap uji sebagai berikut.
1. Jika chunk→magic salah, gagalkan fungsi
2. Jika chunk→state = 1 (allocated), lewati dan lanjutkan memeriksa chunk berikutnya(chunk→next).
3. Jika chunk→size < size yang diminta (not enough), lanjutkan memeriksa chunk berikutnya(chunk→next).
4. Jika chunk→size == size dan chunk→size <= size + sizeof(HCHUNK) (size was fit), langsung alokasikan chunk ini sebagai hasil. Kondisi “chunk→size <= size + ukuran HCHUNK” harus diperiksa, karena jika chunk bebas melebihi yang diminta, kita hanya boleh mengambil sebagian chunk yang cukup, sisanya harus dibuat chunk yang baru (dibuat pada kondisi 5). Sebelum memutuskan buat yang baru, kondisi ini diperiksa untuk memastikan apakah sisa chunk cukup untuk menyimpan header HCHUNK dan minimum chunk sebesar 1 byte. Jika tidak, sebaiknya kita ikutkan saja sisanya sebagai hasil.
5. Apabila tidak masuk kondisi 3 auatupun 4, artinya chunk terlalu besar (size bigger), alokator harus melakukan pemecahan chunk menjadi 2 bagian. Satu bagian sebagai hasil alokasi dan sisanya dibuat untuk dibiarkan dalam kondisi bebas.

void *Malloc(HMALLOC *m,uint size){
for(HCHUNK *c = m-­>first; c != 0; c = c-­>next){
if(c­->magic != CMAGIC){
printf("FATAL:Broken malloc!\n");
return 0;
}
if(c-­>state == 1) continue;
else if(c-­>size < size) continue;
else if((c-­>size >= size) &&
  (c­->size <= size + sizeof(HCHUNK))) {
c-­>state = 1;
return (void*)((ulong)c + sizeof(HCHUNK));
}
else {
HCHUNK *newc;
newc = (HCHUNK*)((ulong)c + sizeof(HCHUNK) + size);
newc­->magic = CMAGIC;
newc­->state = 0;
newc­->size = c­->size - size - sizeof(HCHUNK);
newc­->prev = c;
newc­->next = c-­>next;
c­->next = newc;
c­->size = size;
c­->state = 1;
return (void*)((ulong)c + sizeof(HCHUNK));
}
}
return 0;
}

Periksa kondisi 1
if(c­->magic != CMAGIC){
printf("FATAL:Broken malloc!\n");
return 0;
}

Periksa kondisi 2
if(c-­>state == 1) continue;

Periksa kondisi 3
else if(c­->size < size) continue;

Periksa kondisi 4
else if((c->size >= size) && (c->size <= size + sizeof(HCHUNK))) {
c->state = 1;
return (void*)((ulong)c + sizeof(HCHUNK));
}

Kondisi 5
else {
HCHUNK *newc;
newc = (HCHUNK*)((ulong)c + sizeof(HCHUNK) + size);
newc-­>magic = CMAGIC;
newc­->state = 0;
newc­->size = c->size - size - sizeof(HCHUNK);
newc­->prev = c;
newc­->next = c->next;
c­->next = newc;
c­->size = size;
c-­>state = 1;
return (void*)((ulong)c + sizeof(HCHUNK));
}

Kondisi 5 adalah kondisi yang sedikit membutuhkan logika. Sederhananya, proses untuk menangi kondisi 5 sesuai dengan ilustrasi di bawah ini. Sederhana memang, namun yang sedikit membingungkan adalah mengatur prev dan next agar tetap terhubung satu sama lain.

Sebelum terpecah

Sesudah terpecah

Read more

Contoh Dynamic Memory Allocation Dengan Doubly-linked List, First-fit & Auto Left-Right Join [Part 2]


Penerapan alokator akan membutuhkan 2 struktur data untuk mentracking seluruh aktivitas alokasi. Struktur yang pertama adalah header HMALLOC. Di dalamnya, terdapat informasi mengenai ukuran dari seluruh blok memori yang tersedia dan potongan chunk memori pertama yang berada dalam blok tersebut. Penempatan HMALLOC akan selalu dilakukan di bagian paling awal dari blok, sebelum deretan chunk beserta headernya. Ukuran blok total dan kapasitas maksimum dari chunk itu sendiri akan kita tentukan saat inisialisasi.


Berikut adalah wujud struktur HMALLOC yang ditulis dalam C.

typedef struct _HMALLOC{
uint size;
HCHUNK *first;
}HMALLOC;

Sementara itu, struktur header yang akan selalu terpasang pada setiap awal chunk akan kita sebut sebagai HCHUNK. Struktur ini mendeskripsikan informasi pokok dari chunk yang diwakilinya.

typedef struct _HCHUNK {
int magic;
uint size;
char state;
struct _HCHUNK *prev,*next;
} HCHUNK;

Bagian unik dari HCHUNK adalah field magic. Nilainya akan selalu sama bagi setiap struktur HCHUNK. Kita akan membuat nilainya seunik mungkin. Nilai ini akan kita didefinisakan sebagai CMAGIC.

#define CMAGIC 0xBEDABEDA

Ketika program mengalami kesalahan saat mengakses blok lain, header dapat ter-overwrite, sehingga tak valid lagi. Jika dibiarkan, alokator justru akan berpotensi merusak sistem. Untuk itu, alokator akan menggagalkan alokasi memori saat ditemukan nilai magic yang salah. Saat program gagal mengalokasikan memori, program biasanya akan selalu memeriksa hasil alokasi dan membuat notifikasi ke user apabila terjadi kegagalan, jadi jangan kawatir.

Selanjutnya, field size adalah ukuran dari chunk memori yang diwakili oleh header. Ingat, hanya ukuran chunk saja, tanpa ukuran header. Lalu, field state bertugas memberitahu alokator, apakah field yang diwakili HCHUNK masih bebas atau sudah teralokasi. Nilainya 0 akan dianggap bebas, atau BUKAN 0 apabila teralokasi. Terakhir, field prev dan next adalah 2 buah pointer doubly-linked list yang akan mengarahkan ke struktur HCHUNK disampingnya. Alokator akan menelusuri pointer ini untuk mencari chunk memori yang dapat dialokasikan.

Inisialisasi
Persiapan dilakukan dengan mengatur nilai HMALLOC di dalam blok. Awalnya, sistem harus menyediakan blok memori untuk keperluan alokasi. Fungsi MallocInit() berikut akan memproses blok dari parameter alamat addr dan ukuran size yang diberikan.

HMALLOC *MallocInit(void *addr, uint size){
HMALLOC *m;
if(size <= sizeof(HMALLOC) + sizeof(HCHUNK))
return 0;
m = (HMALLOC *) addr;
m->first = (HCHUNK*) ((ulong)addr + sizeof(HMALLOC));
m->size = size;
m->first->magic = CMAGIC;
m->first->state = 0;
m->first->size = size - sizeof(HMALLOC) - sizeof(HCHUNK);
m->first->prev = m->first->next = 0;
return m;
}

Pertama, periksa apakah blok yang diberikan sudah cukup untuk menyimpan sebuah HMALLOC dan chunk awal sebesar minimal 1 byte, jangan lupa beserta header HCHUNKnya. Jika tidak, fungsi ini harus mengembalikan error.

if(size <= sizeof(HMALLOC) + sizeof(HCHUNK))
return 0;

Letakkan HMALLOC di bagian paling depan dari blok. Lengkapi juga isi tiap fieldnya. Setelah itu chunk pertama (m->first) juga akan dibuat tepat setelah header HMALLOC.

m = (HMALLOC *) addr;
m->first = (HCHUNK*) ((ulong)addr + sizeof(HMALLOC));
m->size = size;

Lalu atur semua nilai field dari HCHUNK untuk chunk pertama. Tentu saja, chunk ini harus dalam keadaan bebas(state = 0). Ukuran chunk akhirnya diketahui dari ukuran argumen size yang dikurangi dengan ukuran header HMALLOC dan ukuran header HCHUNK pertama.

m->first->magic = CMAGIC;
m->first->state = 0;
m->first->size = size - sizeof(HMALLOC) – sizeof(HCHUNK);

Masih HCHUNK pertama kali, jadi, biarkan field next dan prev kosong dulu.

m->first->prev = m->first->next = 0;

Terakhir, kembalikan pointer ke struktur HMALLOC valid yang sudah dibuat. Karena HMALLOC berada di awal blok, alamat HMALLOC yang berhasil dibuat bisa dipastikan == argumen addr. Nantinya, pointer ini akan dijadikan parameter saat alokasi, sehingga alokator tahu, blok mana yang harus diproses dan dimana ia harus menemukan chunk-chunk nya.

return m;

Read more

Contoh Dynamic Memory Allocation Dengan Doubly-linked List, First-fit & Auto Left-Right Join [Part 1]


Virtual memory dapat dialokasikan untuk menyediakan wilayah memori dalam bentuk blok berukuran tetap, membuat kemungkinan fragmentasi semakin kecil. Sayangnya, banyak program cenderung mengalokasikan kebutuhan memori untuk program mereka dalam jumlah banyak, namun dengan ukuran yang relatif jauh lebih kecil dari ukuran blok page virtual memori. Oleh karena itu, diperlukan mekanisme alokasi yang dapat memenuhi kebutuhan tersebut, agar sistem dapat menjaga efisiensi penggunaan memori.

Jika masih bingung dengan latar beakang tulisan ini, coba sedikit mengingat kapan terakhir kali anda membuat program mengalokasikan memori, Biasanya, kita menggunakan malloc() dan free() di lingkungan pemrograman C. Selain itu, di sistem operasi Windows juga tersedia fungsi API yang serupa dengan kedua API library C tersebut, yaitu HeapAlloc() dan HeapFree(). Fungsi semacam itulah yang akan kita coba implementasikan di sini.

Memori perlu memiliki sistematika alokasi, sehingga apabila suatu program sedang menggunakan wilayah memori untuk menangani tugas tertentu, wilayah tersebut akan lebih aman dari campur tangan pekerjaan dari task lain. Meski demikian, masih ada kemungkinan thread lain dapat menggunakan memori yang sudah diklaim sebelumnya, baik itu sengaja atau tidak sengaja. Oleh karena itu perlu juga adanya mekanisme untuk selalu memeriksa kemungkinan buruk tersebut. Tanpa alokasi memori, masing-masing thread dapat menggunakan memori dengan bebas. Masalahnya mulai timbul ketika sudah mulai banyak memori yang digunakan. Celah fragmentasi akan sulit dilacak.


Mekanisme alokasi memori biasanya dilakukan dengan implementasi linked list. Cara sederhana bisa dilakukan dengan membuat linked-list yang menghubungkan setiap potongan (chunk) daerah memory, mulai awal hingga akhir. Sistem yang lebih profesional bahkan membuat 2 macam linked-list untuk memisahkan daerah memori yang sudah dialokasi dan daerah yang bebas. Hal ini membuat proses alokasi semakin cepat.

Sebuah header berada di bagian awal dari setiap chunk, menyediakan informasi instan mengenai kondisi dan properti chunk, seperti ukuran, status chunk dan beberapa hal spesifik lain terkait alokasi memori. Di dalamnyalah linked list akan disematkan. 


Meski keberadaan linked list membantu, ada sedikit masalah yang perlu diatasi saat proses pembebasan memori. Meski pembebasan memori bisa dilakukan dengan cukup mengubah variabel state pada header, linked list masih masih terpasang untuk menghubungkan blok bebas(free blocks) yang harusnya tiada lagi. Lihat ilustrasinya seperti berikut.

1. Kita bayangkan awal layout chunk memori seperti berikut, dimana blok merah
adalah area teralokasi.

2. Program membebaskan beberapa blok memori, sehingga bisa dialokasikan kembali.

3. Program meminta alokasi memori ke sistem; Alokator mencari daerah bebas yang pas dengan ukuran permintaan. Ternyata pencarian gagal, karena tiap header menunjukkan blok dalam ukuran kecil. Padahal, seharusnya beberapa wilayah yang baru saja dibebaskan cukup untuk menampung request yang sedang diminta.

Oleh karena itu, saat proses pembebasan memori, alokator juga bertanggung jawab mengatasi fragmentasi internal semacam ini dengan mengusahakan penggabungan blok (joining). Jika alokator mampu menangani pembebasan memori dengan baik, maka kenampakannya akan seperti berikut.

***
Masalah belum sampai disitu. Jika hanya dengan singly-linked list, alokator hanya dapat melihat dan memeriksa posisi blok di sebelah arah kanan saja. Ini menyebabkan penggabngan blok kurang maksimal. Contoh kasusnya adalah seperti ilustrasi berikut.

1. Layout awal.

2. Program meminta pembebasan sebuah blok memori. Untungnya saat ini, alokator belum memerlukan penggabungan chunk memori.

3. Program meminta pembebasan memori kembali. Sepertinya alokator harus melakukan penggabungan sekarang. Dia menemukan sebah blok bebas disebelahnya.

Ups, alokator tidak dapat membebaskan memori dengan sempurna. Ini karena
singly linked list tidak mempunyai link pointer ke arah kiri (left/previous). Untuk
sekian kalinya, request memori gagal, alokator tidak mengetahui area kosong yang
sebenarnya masih cukup.

Dari adanya permasalahan tersebut, maka tulisan ini akan lebih banyak membahas mekanisme alokasi memori dengan basis sebuah doubly-linked list.
Read more

Kamis, 29 Desember 2016

Masih Ragu Pakai Linux? Kurang Apa? Aplikasi Ini Buat Kamu Mantap Pakai Linux

Saya tidak heran, kenapa banyak orang masih ragu pakai Linux. Apalagi mereka yang setiap hari dibebani tugas kantor; mengetik laporan, desain iklan, dan sebagainya. Ya, saya akui, aplikasi Linux memang belum begitu lengkap dan bagus jika dibandingkan dengan empunya Wid*ws dan M*c. But, If you know these, you'll love it. :D

Meski dalam aplikasi, linux masih kalah; setidaknya Linux unggul dalam banyak hal:
- Free. udah gitu open source lagi. Insya Allah, jauh dari software bajakan. Ingat dosa, dong.
- Customizable. Jangan kawatir, jika kamu tidak suka tampilan linux, baik dari segi ikon, tema ataupun sembarangnya. Linux selalu menjawab kekurangan ini untuk kamu. Iya, kamu. Ada banyak icon pack dan tema lingkungan desktop yang bisa kamu pilih dan install. Bukan sampai disitu, kamu juga bisa mengganti windows manager sampai dengan desktop environment.



- Aman. Tidak heran lagi, di linux semua virus gak bakalan mempan. Seumur-umur pakai linux, saya belum pernah lho sekalipun terserang virus. Bahkan, saya berani membuka virus di Windows dengan tangan dan mouse saya sendiri. -- Sambil melet, dan bilang 'week.. gak mempan'.
- Mudah di atur dan gak suka main di belakang. Saya jamin, Linux tidak akan pernah mencuri data pribadi anda, memaksa update dan menjalankan program yang tidak anda butuhkan. Jika memang ada, kita bisa mengaturnya dengan mudah, dan linux tak akan melakukannya kembali.

Jika masih belum yakin, ini aplikasi yang bakal merubah jalan pikiran agan.
1. Wine
Jika sulit move on, jalankan aplikasi Windows kesayanganmu dengan Wine. Aplikasinya tidak akan terlihat seperti jalan di emulator. Bahkan tampilannya mirip seperti berjalan di Windows. Winde menggunakan teknologi virtualisasi, jadi jangan takut aplikasinya lambat. Wine bukan cuma sekedar emulator gan.

2. Shashlik
Jika susah mengejanya cukup ingat ingat shampoo Sunsilk gan. hehe. Hampir seperti Wine. Shashlik adalah program untuk mengemulasikan program Android. Program android yang anda jalankan akan terlihat seperti program biasa bagi Linux.

3. Emulator untuk berbagai macam device dan aplikasi.
Jika aplikasi dari 2 raja aplikasi (Windows dan Android), masih belum cukup, aplikasi emulator di Linux bisa anda gunakan. Misalnya QEMU, untuk emulasi sistem operasi yang biasanya berjalan pada prosesor x86, ARM, MIPS, SPARC, ...; FCEUX untuk menjalankan game nintendo; DESMUME, untuk menjalankan game nintendo DS; Dan masih banyak lagi, hampir semua jenis game dari platform lain bisa dijalankan di Linux. Apa di Windows tidak ada? Ada, tapi coba survei di situsnya. Sebagian besar, awalnya dikembangkan untuk Linux saja, lho.

Ada banyaaaak lagi aplikasi yang masih bisa kamu jalankan di Linux.  Penasaran kan seperti apa kerennya? Yuk, migrasi ke Linux.
NB :
- Jika masih ragu, dual boot Windows dan Linux adalah pilihan yang tepat.
- Saya rekomendasikan pengguna baru untuk install Linux Ubuntu atau OpenSuSE.

Read more

Minggu, 25 Desember 2016

Episode Membuat Sistem Operasi: Mengistall Bootloader Hingga Mencetak Hello World (C dan Assembly + Video)

 

Tulisan ini tidak akan membahas banyak hal, dan tidak pula menjelaskan setiap poinnya dengan panjang lebar. Namun, agar terlihat menarik, saya sengaja menggunakan judul sepanjang itu. hehehe

Tutorial ini dapat diikuti dengan 2 cara; lihat video berikut dahulu, atau baca penjelasan yang diberikan di bawah, sebelum melihat video. #gak_penting


Persiapan
Pertama-tama, kita siapkan virtual disk dan memformatnya dengan filesystem FAT.

#dd if=/dev/zero of=disk.img bs=512 count=20000
#mkdosfs disk.img

Device /dev/zero adalah device yang akan selalu mengembalikan data 0 ketika dibaca. Kita menggunakan argumen input file (if) berupa device ini agar, virtual disk yang baru berisi data yang benar-benar kosong. Lalu output file (of) akan saya namakan sebagai disk.img. Besar virtual disk yang saya inginkan adalah 20000 sektor, yang tiap sektornya terdapat 512 byte. Kedua parameter ini di atur dengan block size (bs) dan count.

Perintah mkdosfs selanjutnya berguna untuk memformat virtual disk dengan filesystem FAT.

Instalasi GRUB 2
Alasan saya memilih GRUB, karena menurut saya GRUB adalah yang terbaik di antara bootloader lain. Bootloader lain umumnya hanya fokus pada dukungan sistem operasi linux, tidak untuk hobyist OS developer seperti kita. Meski begitu, GRUB 2 belum didukung platform Windows, jadi tutorial ini dikhususkan bagi anda yang memahami Linux. Jangan patah semangat, kalau memang tertarik dengan pengembangan OS, coba dual boot Windows + Ubuntu. [RECOMENDED]

losetup /dev/loopX disk.img
(Sekarang, mount  /dev/loopX di suatu tempat)
grub-install --force --root-directory=<lokasi_mount> /dev/nama_device

Pertama, kita harus memasang virtual disk yang baru dibuat ke loop device, yaitu dengan losetup. Gunakan format seperti diatas dengan mengubah X menjadi 0, 1, atau 2. Setelah dipasang, virtual disk akan bekerja sepeti block device nyata yang dapat diakses sebagai /dev/loopX.

Sekarang, mount loop device ke suatu tempat. Biar mudah, kita juga bisa mount lewat file manager langsung.

GRUB menyediakan grub-install sebagai program pembantu proses instalasi. Instalasi dapat dilakukan di block device manapun yang berproperti read write. Hampir semua filesystem didukung oleh GRUB, namun ada kalanya suatu hal membuat GRUB sulit bekerja pada filesystem tersebut. Oleh karena itu, tidak ada salahnya kita sedikit menyulitkan GRUB dengan --force. Hasilnya memang terlihat beberapa warning, tapi jangan kawatir, aman, kok. Tentukan lokasi mount dengan lokasi mount loop device. Lalu, apa nama device? tentu saja /dev/loopX..

Buat konfigurasi GRUB
 Metode loading kernel yang akan dilakukan adalah berdasarkan spesifikasi multiboot 2. Jadi kita perlu meload modul multiboot2, dari konfigurasi berikut.

set timeout=30
set default=0
menuentry 'Hello world' {
insmod multiboot2
multiboot2 /System/hello
}


Simpan pada device yang telah di mount sebagai /boot/grub/grub.cfg.

Buat project
Ada 3 macam file yang harus kita buat.
ldscript.txt
File ini berisi linker script, berguna untuk mengatur ulang section dari object files, sehingga sesuaii dengan keinginan kita.

ENTRY(multiboot_entry)
SECTIONS
{
  .text 0x1000000 :
  {
    text = .;
    /*header multiboot harus berada di awal section*/
    ./Release/multiboot2.s.o(*)
    *(.text)
  }
  .data :
  {
     data = .;
     *(.data)
     *(.rodata*)
  }
  .bss :
  {
    bss = .;
    *(.bss)
  }
  /DISCARD/ :
  {
    *(*)
  }
  end = .;
}  



Setiap mengompile file, dihasilkan sebuah object file. Dalam object file terbagi beberapa macam bagian (section), section umum yang akan selalu dihasilkan adalah .text (berisi instruksi komputer), .data (berisi data program) dan .bss (berisi data program yang memiliki nilai awal 0). Data yang berupa teks yang tidak pernah diubah selma program berjalan biasanya disimpan pada .rodata(read-only data).

int myvar = 0; --> .data

int myvar; sama seperti
int myvar = 0; --> .bss

Untuk melihat section pada objek, gunakan perintah berikut:

objdump -x namafileobjek.o

Program yang dihasilkan dengan linker script ini akan dieksekusi pada alamat memori 0x1000000. Prosedur yang dieksekusi pertama adalah multiboot_entry().

multiboot.s
.intel_syntax noprefix
.extern KMain
.global multiboot_entry

.text
    .align 8
    multiboot_header_start:
        .long 0xE85250D6
        .long 0
        .long multiboot_header_end - multiboot_header_start
        .long -(0xE85250D6+0+(multiboot_header_end - multiboot_header_start))
        .align 8
        address_tag:
            .short    2
            .short    0
            .long    24
            .long    multiboot_header_start
            .long    text
            .long    bss
            .long    end
        .align 8
        entry_tag:
            .short    3
            .short    0
            .long    12
            .long    multiboot_entry
            .align 8

/*    framebuffer_tag:
            .short    5
            .short    0
            .long    20
            .long    640
            .long    480
            .long    32
        .align 8
*/       
        end_tag:
            .short    0
            .short    0
            .long    8
        .align 8
    multiboot_header_end:
   
    multiboot_entry:
        push ebx
        call KMain
        jmp $


Header multiboot harus berada di bagian paling awal dari file yang diload bootloader. Lokasinya juga harus dalam alignment 8 byte. Menurut spesifikasi, bootloader akan mencari header di beberapa byte pertama dari file. Jika ditemukan nilai indikator magic yang tepat, bootloader harus melanjutkan loading file tersebut. Selengkapnya mengenai konfigurasi Multiboot, kunjungi grup Programmer OS Indonesia, atau baca dokumentasi Multiboot v 2.

Saat multiboot_entry() terpanggil, ia akan memnggi fungsi KMain(), di fungsi tersebutlah kita memulai pekerjaan kita. Saat bootloader selesai, ia mengisi EBX dengan alamat multiboot tag. Kita dapat menemukan banyak informasi dari multiboot tag ini. Tapi, sekarang bukan saat yang tepat untuk mempelajarinya.

kmain.c
Untuk menghasilkan output, kita dapat menulis karakter di memori 0xB8000. Setiap 2 byte, dimulai dari alamat tersebut merepresentasikan sebuah karakter yang akan dicetak mulai dari pojok kiri atas. 1 byte pertama adalah karakter dan 1 byte lagi adalah atribut warna karakter. Saya juga sudah menulis penjelasan lebih lengkap di Programmer OS Indonesia.

//Biar tambah keren
static char *vidmem = 0xB8000;
void print(char *str){
    while(*str != 0){
        *vidmem = *str;
        vidmem++;
        *vidmem = 0x0F; //attribute
        vidmem++;
        str++;
    }
}

int KMain(void *arg)
{
    print("Hello world!");
}


Build
Untuk source code C, kompilasi dilakukan dengan perintah:
gcc -c -masm=intel -m32 -nostdinc -fnostack-protector -ffreestanding

-masm=intel digunakan agar kita dapat menggunakan syntax assembly intel saat menggunakan inline assembly di C.
-m32 untuk mnghasilkan kode instuksi 32-bit.
-nostdinc untuk melarang kompiler menginclude standard header otomatis.
-fnostack-protector agar compiler tidak melakukan optimisasi saat akses stack.
-ffreestanding untuk memastikan agar compiler tidak menginput kode tambahan lain, terutama kode yang berkaitan dengan host OS.

Untuk kode assembly:
as --32 -msyntax=intel

Maksudnya, argumen tersebut mengatakan bahwa kita ingin mengompile source yang ditulis dalam syntax intel ke dalam objek yang berformat instruksi 32-bit.

Untuk building file object:
gcc -nostdlib -T ldscript.txt

-nostdlib mencegah linker memadukan program dengan library system operasi host. Jangan lupa, kita haru membuat output agar seuai linker script dengan -T.

Run
Build seluruh source code, taruh hasilnya pada virtual disk sebagai /System/hello.
Unmount virtual disk, lalu jalankan dengan qemu-system-i386 disk,img atau qemu-system-i386 /dev/loop0.

http://www.facebook.com/groups/programmer.os.indonesia

Read more

Jumat, 23 Desember 2016

Pengertian Interrupt, Exception, Trap, Fault, IRQ dan Abort

interrupt, traps, fault, exception

Interrupt adalah suatu mekanisme prosesor dimana saat hal tersebut terjadi, prosesor akan menunda proses eksekusi. Setiap interrupt akan memiliki kode instruksi handler yang harus disediakan oleh sistem operasi. Kode instruksi ini bekerja layaknya fungsi subrutin biasa. Ia akan dipanggil sesuai dengan jenis sumber interrupt yang telah dikonfigurasikan oleh sistem operasi.

Pada dasarnya, interrupt sama saja seperti peristiwa pemanggilan fungsi biasa, layaknya saat melompat ke suatu prosedur dari fungsi main().

int main(){
function_to_call()
}

Bedanya, interrupt terjadi secara tak terduga dan tidak dapat dikontrol oleh program. Meskipun demikian, sistem operasi masih dapat mengontrol laju kerja interrupt jika dikehendaki demikian.

Seluruh pekerjaan program pada dasarnya merupakan proses matematis yang diatur jalannya oleh instruksi. Hasil pekerjaan yang diproses oleh program tersimpan dalam register. Oleh karena itu, kita tidak boleh membiarkan isi dari register ini termodifikasi oleh pihak lain, salah satunya adalah interrupt. Interrupt menyebabkan register instruction pointer (IP) atau program counter (PC) berpindah ke lokasi dimana interrupt handler berada. Yang bertugas menyediakan fungsi handler untuk seluruh interrupt adalah sistem operasi.

Seperti program lain, untuk bekerja, interrupt handler tentu membutuhkan register. Kita ingat bahwa konten register ini adalah bagian kerja dari program yang terinterupsi sebelumnya. Apabila termodifikasi sedikit saja, dapat dipastikan hasil kerja program menjadi tidak valid lagi. Jadi, sebuah interrupt handler perlu menyimpan konten seluruh register sebelum melakukan sesuatu, misalnya ke dalam stack.

Sebuah prosedur yang ditulis dengan bahasa pemrograman manapun, memiliki pola kerja yang sama. Jika direpresentasikan dalam bahasa assembly, semua prosedur dipanggil dengan cara yang sama, yaitu dengan instruksi CALL. Saat instruksi ini terjadi, sebenarnya prosesor menaruh nilai alamat Instruction Pointer(IP) ke stack dan melakukan jump(JMP) ke lokasi fungsi. Anda akan tahu tujuannya setelah membaca penjelasan selanjutnya.

Setiap prosedur, bagaimanapun bentuknya juga akan memiliki akhiran instruksi yang sama, yaitu RET. Instruksi RET berguna mengembalikan nilai IP yang baru saja ditaruh oleh pemanggil fungsi melalui instruksi CALL. Dengan cara seperti inilah prosesor bisa tahu dimana ia harus kembali setelah eksekusi sebuah fungsi telah selesai.

C:
MyProc(){
...
return;
}
Caller(){
MyProc();
}

ASM:
MyProc:
...
ret



Caller:
call MyProc

Bagaimana dengan interrupt? Mekanismenya masih sama, kok. Tapi, konten yang berada di dalam stack sedikit lebih banyak. Saat interrupt terjadi, prosesor melompat ke interrupt handler, sambil menaruh 3 buah data konten register yang berbeda ke dalam stack:
EFLAGS
CS
EIP

Lalu, bentuk fungsi handler interrupt tidak lagi menggunakan instruksi RET, ya. Untuk menyelesaikan eksekusi, handler menggunakan instruksi IRET. Instruksi ini akan mengembalikan konten ketiga register di atas ke posisi semula, bersamaan dengan kembali ke lokasi dimana program mulai terinterupsi.
Umumnya, interrupt handler akan menaruh konten general purpose register sebelum mulai bekerja dan mengembalikannya saat telah selesai. Dengan demikian, state kondisi kerja program yang terinterupsi tetap valid.

MyInterruptHandler:
pusha
...
popa
iret


Macam Interrupt
Ada beberapa kelompok besar interrupt yang biasa dikenal. Setiap jenisnya memiliki tingkah laku dan sumber pemicu yang berbeda.

1. Exception, yaitu interrupt yang dihasilkan oleh prosesor ketika terjadi kesalahan pada prosesor, karena eksekusi instruksi yang tidak dibenarkan kegunaannya, atau juga bisa karena prosesor menjalankan instruksi yang memang disediakan untuk menghasilkan exception secara disengaja. Exception itu sendiri dapat dibagi menjadi 3 macam:

  • Trap: Interupsi yang disengaja dengan menjalankan instruksi trap. Biasanya kondisi ini dimanfaatkan oleh sistem operasi untuk tujuan debugging.
  • Fault: Dipicu oleh kesalahan operasi yang dilakukan oleh prosesor. Seringkali interrupt dalam golongan ini muncul akibat eksekusi instruksi yang tidak valid. Dalam kondisi fault, sistem operasi biasanya masih dapat melakukan perbaikan dan melanjutkan eksekusi instruksi selanjutnya. Jika tidak memungkinkan, program yang menimbulkan fault harus diakhiri segera.
  • Abort: Timbul akibat kesalahan fatal prosesor yang sudah tidak dapat ditangani. Bisa disebabkan karena kerusakan, atau karena beberapa kesalahan fault yang seharusnya tidak dibiarkan.


2. Interrupt Request(IRQ), seringkali disebut sebagai hardware interrupt. Munculnya dipicu oleh peripheral device yang terhubung dengan jalur interupsi prosesor. Biasanya IRQ muncul saat hardware membutuhkan penanganan dari prosesor. Misalnya, ketika mouse digerakkan, ia akan mengirimkan interupsi untuk memberitahukan bahwa ada event yang sedang terjadi pada mouse. Dalam handler IRQ, terdapat deretan instruksi untuk melakukan transaksi data dengan hardware penghasil interrupt, melalui port. Setiap hardware yang dapat meghasilkan interupsi akan memiliki jalur interrupt yang berbeda dengan tujuan interupsi beragam. Jika ingin mengetahuinya secara detail, kita perlu membaca dokumen spesifikasi yang terkait dengan hardware tersebut.

3. Software Interrupt, yaitu interrupt yang dihasilkan oleh software. Biasanya digunakan untuk tujuan komunikasi antara user space program dan kernel. Di Intel, software interrupt dapat dihasilkan dengan instruksi INT x, dimana x adalah nomor interrupt handler yang akan dipanggil.
Read more